package com.xsky.common.util;

	import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.crypto.spec.SecretKeySpec;
	/** *//**
	* PBE安全编码组件
	*
	*/
	public abstract class PBECoder{

		/**

		* 加密

		*

		* @param content 需要加密的内容

		* @param password  加密密码

		* @return

		*/

		public static byte[] encrypt(String content, String password) {

		try {

		KeyGenerator kgen = KeyGenerator.getInstance("AES");

		kgen.init(128, new SecureRandom(password.getBytes()));

		SecretKey secretKey = kgen.generateKey();

		byte[] enCodeFormat = secretKey.getEncoded();

		SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

		Cipher cipher = Cipher.getInstance("AES");// 创建密码器

		byte[] byteContent = content.getBytes("utf-8");

		cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化

		byte[] result = cipher.doFinal(byteContent);

		return result; // 加密

		} catch (NoSuchAlgorithmException e) {

		e.printStackTrace();

		} catch (NoSuchPaddingException e) {

		e.printStackTrace();

		} catch (InvalidKeyException e) {

		e.printStackTrace();

		} catch (UnsupportedEncodingException e) {

		e.printStackTrace();

		} catch (IllegalBlockSizeException e) {

		e.printStackTrace();

		} catch (BadPaddingException e) {

		e.printStackTrace();

		}

		return null;

		}
		/**解密

		　　* @param content  待解密内容

		　　* @param password 解密密钥

		　　* @return

		　　*/

		public static byte[] decrypt(byte[] content, String password) {

		try {

		KeyGenerator kgen = KeyGenerator.getInstance("AES");

		kgen.init(128, new SecureRandom(password.getBytes()));

		SecretKey secretKey = kgen.generateKey();

		byte[] enCodeFormat = secretKey.getEncoded();

		SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

		Cipher cipher = Cipher.getInstance("AES");// 创建密码器

		cipher.init(Cipher.DECRYPT_MODE, key);// 初始化

		byte[] result = cipher.doFinal(content);

		return result; // 加密

		} catch (NoSuchAlgorithmException e) {

		e.printStackTrace();

		} catch (NoSuchPaddingException e) {

		e.printStackTrace();

		} catch (InvalidKeyException e) {

		e.printStackTrace();

		} catch (IllegalBlockSizeException e) {

		e.printStackTrace();

		} catch (BadPaddingException e) {

		e.printStackTrace();

		}

		return null;

		}

	/** *//**
	* 支持以下任意一种算法
	*
	* <pre>
	* PBEWithMD5AndDES
	* PBEWithMD5AndTripleDES
	* PBEWithSHA1AndDESede
	* PBEWithSHA1AndRC2_40
	* </pre>
	*/
	public static final String ALGORITHM = "PBEWITHMD5andDES";
	/** *//**
	* 盐初始化
	*
	* @return
	* @throws Exception
	*/
	public static byte[] initSalt() throws Exception {
	byte[] salt = new byte[8];
	String saltStr = "abcdefgh";
	salt = saltStr.getBytes();
	System.out.println(salt.length);
//	
//	Random random = new Random();
//	random.nextBytes(salt);
	return salt;
	}
	/** *//**
	* 转换密钥<br>
	*
	* @param password
	* @return
	* @throws Exception
	*/
	private static Key toKey(String password) throws Exception {
	PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
	SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
	SecretKey secretKey = keyFactory.generateSecret(keySpec);
	return secretKey;
	}
	/** *//**
	* 加密
	*
	* @param data
	* 数据
	* @param password
	* 密码
	* @param salt
	* 盐
	* @return
	* @throws Exception
	*/

	        public static byte[] encrypt(byte[] data, String password, byte[] salt)
	throws Exception {
	Key key = toKey(password);
	PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
	Cipher cipher = Cipher.getInstance(ALGORITHM);
	cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
	return cipher.doFinal(data);
	}
	/** *//**
	* 解密
	*
	* @param data
	* 数据
	* @param password
	* 密码
	* @param salt
	* 盐
	* @return
	* @throws Exception
	*/
	public static byte[] decrypt(byte[] data, String password, byte[] salt)
	throws Exception {
	Key key = toKey(password);
	PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
	Cipher cipher = Cipher.getInstance(ALGORITHM);
	cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
	return cipher.doFinal(data);
	}
	/**将二进制转换成16进制

	　　* @param buf

	　　* @return

	　　*/

	public static String parseByte2HexStr(byte buf[]) {

	StringBuffer sb = new StringBuffer();

	for (int i = 0; i < buf.length; i++) {

	String hex = Integer.toHexString(buf[i] & 0xFF);

	if (hex.length() == 1) {

	hex = '0' + hex;

	}

	sb.append(hex.toUpperCase());

	}

	return sb.toString();

	}
	/**将16进制转换为二进制

	　　* @param hexStr

	　　* @return

	　　*/

	public static byte[] parseHexStr2Byte(String hexStr) {

	if (hexStr.length() < 1)

	return null;

	byte[] result = new byte[hexStr.length()/2];

	for (int i = 0;i< hexStr.length()/2; i++) {

	int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);

	int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);

	result[i] = (byte) (high * 16 + low);

	}

	return result;

	}
	}

